home *** CD-ROM | disk | FTP | other *** search
- #ifndef MIKMOD_H
- #define MIKMOD_H
-
- #include <stdio.h>
- #include "mtypes.h" /* include atomic mikmod types */
-
-
- #define mikbanner \
- "=======================================================================\n" \
- "MIKMOD v2.10 - Portable version - Programmed by MikMak of HaRDCoDE '95\n" \
- "=======================================================================\n" \
- "This program is SHAREWARE - Read MIKMOD.TXT for more info\n" \
- "E-Mail : mikmak@stack.urc.tue.nl\n"
-
-
- /*
- error variables:
- ===============
- */
-
- extern char *ERROR_ALLOC_STRUCT;
- extern char *ERROR_LOADING_PATTERN;
- extern char *ERROR_LOADING_TRACK;
- extern char *ERROR_LOADING_HEADER;
- extern char *ERROR_NOT_A_MODULE;
- extern char *ERROR_LOADING_SAMPLEINFO;
- extern char *ERROR_OUT_OF_HANDLES;
- extern char *ERROR_SAMPLE_TOO_BIG;
- extern char *myerr;
-
-
-
- #define _mm_rewind(x) _mm_fseek(x,0,SEEK_SET)
- int _mm_fseek(FILE *stream,long offset,int whence);
- void _mm_setiobase(long iobase);
- long _mm_ftell(FILE *stream);
-
-
- extern SBYTE _mm_read_SBYTE (FILE *fp);
- extern UBYTE _mm_read_UBYTE (FILE *fp);
-
- extern SWORD _mm_read_M_SWORD (FILE *fp);
- extern SWORD _mm_read_I_SWORD (FILE *fp);
-
- extern UWORD _mm_read_M_UWORD(FILE *fp);
- extern UWORD _mm_read_I_UWORD(FILE *fp);
-
- extern SLONG _mm_read_M_SLONG (FILE *fp);
- extern SLONG _mm_read_I_SLONG (FILE *fp);
-
- extern ULONG _mm_read_M_ULONG(FILE *fp);
- extern ULONG _mm_read_I_ULONG(FILE *fp);
-
- extern int _mm_read_str(char *str, int size, FILE *fp);
-
- extern int _mm_read_SBYTES (SBYTE *buffer, int number, FILE *fp);
- extern int _mm_read_UBYTES (UBYTE *buffer, int number, FILE *fp);
-
- extern int _mm_read_M_SWORDS (SWORD *buffer, int number, FILE *fp);
- extern int _mm_read_I_SWORDS (SWORD *buffer, int number, FILE *fp);
-
- extern int _mm_read_M_UWORDS (UWORD *buffer, int number, FILE *fp);
- extern int _mm_read_I_UWORDS (UWORD *buffer, int number, FILE *fp);
-
- extern int _mm_read_M_SLONGS (SLONG *buffer, int number, FILE *fp);
- extern int _mm_read_I_SLONGS (SLONG *buffer, int number, FILE *fp);
-
- extern int _mm_read_M_ULONGS (ULONG *buffer, int number, FILE *fp);
- extern int _mm_read_I_ULONGS (ULONG *buffer, int number, FILE *fp);
-
-
- extern void _mm_write_SBYTE (SBYTE data,FILE *fp);
- extern void _mm_write_UBYTE (UBYTE data,FILE *fp);
-
- extern void _mm_write_M_SWORD (SWORD data,FILE *fp);
- extern void _mm_write_I_SWORD (SWORD data,FILE *fp);
-
- extern void _mm_write_M_UWORD (UWORD data,FILE *fp);
- extern void _mm_write_I_UWORD (UWORD data,FILE *fp);
-
- extern void _mm_write_M_SLONG (SLONG data,FILE *fp);
- extern void _mm_write_I_SLONG (SLONG data,FILE *fp);
-
- extern void _mm_write_M_ULONG (ULONG data,FILE *fp);
- extern void _mm_write_I_ULONG (ULONG data,FILE *fp);
-
- extern void _mm_write_SBYTES (SBYTE *data, int number,FILE *fp);
- extern void _mm_write_UBYTES (UBYTE *data, int number,FILE *fp);
-
- extern void _mm_write_M_SWORDS (SWORD *data, int number,FILE *fp);
- extern void _mm_write_I_SWORDS (SWORD *data, int number,FILE *fp);
-
- extern void _mm_write_M_UWORDS (UWORD *data, int number,FILE *fp);
- extern void _mm_write_I_UWORDS (UWORD *data, int number,FILE *fp);
-
- extern void _mm_write_M_SLONGS (SLONG *data, int number,FILE *fp);
- extern void _mm_write_I_SLONGS (SLONG *data, int number,FILE *fp);
-
- extern void _mm_write_M_ULONGS (ULONG *data, int number,FILE *fp);
- extern void _mm_write_I_ULONGS (ULONG *data, int number,FILE *fp);
-
-
- /**************************************************************************
- ****** Unitrack stuff: ****************************************************
- **************************************************************************/
-
- /*
- prototypes:
- */
-
- void UniSetRow(UBYTE *t);
- UBYTE UniGetByte(void);
- UBYTE *UniFindRow(UBYTE *t,UWORD row);
- void UniReset(void);
- void UniWrite(UBYTE data);
- void UniNewline(void);
- void UniInstrument(UBYTE ins);
- void UniNote(UBYTE note);
- void UniPTEffect(UBYTE eff,UBYTE dat);
- UBYTE *UniDup(void);
- void UniSkipOpcode(UBYTE op);
- BOOL UniInit(void);
- void UniCleanup(void);
- UWORD TrkLen(UBYTE *t);
- BOOL MyCmp(UBYTE *a,UBYTE *b,UWORD l);
-
- /*
- all known effects:
- */
-
- enum {
- UNI_NOTE=1,
- UNI_INSTRUMENT,
- UNI_PTEFFECT0,
- UNI_PTEFFECT1,
- UNI_PTEFFECT2,
- UNI_PTEFFECT3,
- UNI_PTEFFECT4,
- UNI_PTEFFECT5,
- UNI_PTEFFECT6,
- UNI_PTEFFECT7,
- UNI_PTEFFECT8,
- UNI_PTEFFECT9,
- UNI_PTEFFECTA,
- UNI_PTEFFECTB,
- UNI_PTEFFECTC,
- UNI_PTEFFECTD,
- UNI_PTEFFECTE,
- UNI_PTEFFECTF,
- UNI_S3MEFFECTA,
- UNI_S3MEFFECTD,
- UNI_S3MEFFECTE,
- UNI_S3MEFFECTF,
- UNI_S3MEFFECTI,
- UNI_S3MEFFECTQ,
- UNI_S3MEFFECTT,
- UNI_XMEFFECTA,
- UNI_XMEFFECTG,
- UNI_XMEFFECTH,
- UNI_XMEFFECTP
- };
-
-
- /**************************************************************************
- ****** mikmod types: ******************************************************
- **************************************************************************/
-
-
- /*
- Sample format flags:
- */
-
- #define SF_16BITS 1
- #define SF_SIGNED 2
- #define SF_DELTA 4
- #define SF_BIG_ENDIAN 8
- #define SF_LOOP 16
- #define SF_BIDI 32
- #define SF_OWNPAN 64
- #define SF_REVERSE 128
-
-
- /*
- Envelope flags:
- */
-
- #define EF_ON 1
- #define EF_SUSTAIN 2
- #define EF_LOOP 4
-
-
- /*
- Unimod flags
- */
-
- #define UF_XMPERIODS 1 /* if set use XM periods/finetuning */
- #define UF_LINEAR 2 /* if set use LINEAR periods */
-
-
- typedef struct ENVPT{
- SWORD pos;
- SWORD val;
- } ENVPT;
-
-
- typedef struct SAMPLE{
- UWORD c2spd; /* finetune frequency */
- SBYTE transpose; /* transpose value */
- UBYTE volume; /* volume 0-64 */
- UBYTE panning; /* panning */
- ULONG length; /* length of sample (in samples!) */
- ULONG loopstart; /* repeat position (relative to start, in samples) */
- ULONG loopend; /* repeat end */
- UWORD flags; /* sample format */
- ULONG seekpos; /* seek position in file */
- char *samplename; /* name of the sample */
- SWORD handle; /* sample handle */
- } SAMPLE;
-
-
- typedef struct INSTRUMENT{
- UBYTE numsmp;
- UBYTE samplenumber[96];
-
- UBYTE volflg; /* bit 0: on 1: sustain 2: loop */
- UBYTE volpts;
- UBYTE volsus;
- UBYTE volbeg;
- UBYTE volend;
- ENVPT volenv[12];
-
- UBYTE panflg; /* bit 0: on 1: sustain 2: loop */
- UBYTE panpts;
- UBYTE pansus;
- UBYTE panbeg;
- UBYTE panend;
- ENVPT panenv[12];
-
- UBYTE vibtype;
- UBYTE vibsweep;
- UBYTE vibdepth;
- UBYTE vibrate;
-
- UWORD volfade;
- char *insname;
- SAMPLE *samples;
- } INSTRUMENT;
-
-
- /*
- MikMod UNImod types:
- ====================
- */
-
- typedef struct UNIMOD{
- UBYTE numchn; /* number of channels */
- UWORD numpos; /* number of positions in this song */
- UWORD reppos; /* restart position */
- UWORD numpat; /* number of patterns in this song */
- UWORD numtrk; /* number of tracks */
- UWORD numins; /* number of samples */
- UBYTE initspeed; /* */
- UBYTE inittempo; /* */
- UBYTE positions[256]; /* all positions */
- UBYTE panning[32]; /* 32 panning positions */
- UBYTE flags; /* */
- char *songname; /* name of the song */
- char *modtype; /* string type of module */
- char *comment; /* module comments */
- INSTRUMENT *instruments; /* all samples */
- UWORD *patterns; /* array of PATTERN */
- UWORD *pattrows; /* array of number of rows for each pattern */
- UBYTE **tracks; /* array of pointers to tracks */
- } UNIMOD;
-
-
- /**************************************************************************
- ****** Loader stuff: ******************************************************
- **************************************************************************/
-
- /*
- loader structure:
- */
-
- typedef struct LOADER{
- struct LOADER *next;
- char *type;
- char *version;
- BOOL (*Init)(void);
- BOOL (*Test)(void);
- BOOL (*Load)(void);
- void (*Cleanup)(void);
- } LOADER;
-
-
- /*
- public loader variables:
- */
-
- extern UNIMOD of;
- extern FILE *modfp;
- extern UWORD finetune[16];
-
-
- /*
- main loader prototypes:
- */
-
- void ML_InfoLoader(void);
- void ML_RegisterLoader(LOADER *ldr);
- UNIMOD *ML_LoadFP(FILE *fp);
- UNIMOD *ML_LoadFN(char *filename);
- void ML_Free(UNIMOD *mf);
-
-
- /*
- other loader prototypes: (used by the loader modules)
- */
-
- BOOL InitTracks(void);
- void AddTrack(UBYTE *tr);
- BOOL ReadComment(UWORD len);
- BOOL AllocPatterns(void);
- BOOL AllocTracks(void);
- BOOL AllocInstruments(void);
- BOOL AllocSamples(INSTRUMENT *i);
- char *DupStr(char *s,UWORD len);
- void *MyMalloc(size_t size);
- void *MyCalloc(size_t nitems,size_t size);
-
-
- /*
- Declare external loaders:
- */
- extern LOADER load_uni;
- extern LOADER load_mod;
- extern LOADER load_m15;
- extern LOADER load_mtm;
- extern LOADER load_s3m;
- extern LOADER load_stm;
- extern LOADER load_ult;
- extern LOADER load_xm;
-
-
- /**************************************************************************
- ****** Wavload stuff: *****************************************************
- **************************************************************************/
-
- SAMPLE *MW_LoadWavFP(FILE *fp);
- SAMPLE *MW_LoadWavFN(char *filename);
- void MW_FreeWav(SAMPLE *si);
-
-
- /**************************************************************************
- ****** Driver stuff: ******************************************************
- **************************************************************************/
-
- /*
- max. number of handles a driver has to provide. (not strict)
- */
-
- #define MAXSAMPLEHANDLES 128
-
-
- /*
- possible mixing mode bits:
- */
-
- #define DMODE_STEREO 1
- #define DMODE_16BITS 2
- #define DMODE_INTERP 4
-
-
- /*
- driver structure:
- */
-
- typedef struct DRIVER{
- struct DRIVER *next;
- char *Name;
- char *Version;
- BOOL (*IsPresent) (void);
- SWORD (*SampleLoad) (FILE *fp,ULONG size,ULONG reppos,ULONG repend,UWORD flags);
- void (*SampleUnLoad) (SWORD handle);
- BOOL (*Init) (void);
- void (*Exit) (void);
- void (*PlayStart) (void);
- void (*PlayStop) (void);
- void (*Update) (void);
- void (*VoiceSetVolume) (UBYTE voice,UBYTE vol);
- void (*VoiceSetFrequency) (UBYTE voice,ULONG frq);
- void (*VoiceSetPanning) (UBYTE voice,UBYTE pan);
- void (*VoicePlay) (UBYTE voice,SWORD handle,ULONG start,ULONG size,ULONG reppos,ULONG repend,UWORD flags);
- } DRIVER;
-
-
- /*
- public driver variables:
- */
-
- extern DRIVER *md_driver;
- extern UWORD md_device;
- extern UWORD md_mixfreq;
- extern UWORD md_dmabufsize;
- extern UWORD md_mode;
- extern UBYTE md_numchn;
- extern UBYTE md_bpm;
- extern void (*md_player)(void);
-
- /*
- main driver prototypes:
- */
-
- void MD_InfoDriver(void);
- void MD_RegisterDriver(DRIVER *drv);
- void MD_RegisterPlayer(void (*plr)(void));
- SWORD MD_SampleLoad(FILE *fp,ULONG size,ULONG reppos,ULONG repend,UWORD flags);
- void MD_SampleUnLoad(SWORD handle);
- BOOL MD_Init(void);
- void MD_Exit(void);
- void MD_PlayStart(void);
- void MD_PlayStop(void);
- void MD_SetBPM(UBYTE bpm);
- void MD_Update(void);
- void MD_VoiceSetVolume(UBYTE voice,UBYTE ivol);
- void MD_VoiceSetFrequency(UBYTE voice,ULONG frq);
- void MD_VoiceSetPanning(UBYTE voice,ULONG pan);
- void MD_VoicePlay(UBYTE voice,SWORD handle,ULONG start,ULONG size,ULONG reppos,ULONG repend,UWORD flags);
- void SL_Init(FILE *fp,UWORD infmt,UWORD outfmt);
- void SL_Load(void *buffer,ULONG length);
-
- /*
- Declare external drivers:
- */
-
- extern DRIVER drv_gus; /* gravis ultrasound driver */
- extern DRIVER drv_sb; /* soundblaster DSP driver */
- extern DRIVER drv_ss; /* ensoniq soundscape driver */
- extern DRIVER drv_nos; /* nosound driver */
- extern DRIVER drv_raw; /* file output driver */
- extern DRIVER drv_w95; /* win95 driver */
- extern DRIVER drv_awe; /* experimental SB-AWE driver */
- extern DRIVER drv_vox; /* linux voxware driver */
- extern DRIVER drv_af; /* Dec Alpha AudioFile driver */
- extern DRIVER drv_sun; /* Sun driver */
- extern DRIVER drv_os2; /* Os2 driver */
- extern DRIVER drv_tim; /* timing driver */
-
- /**************************************************************************
- ****** Player stuff: ******************************************************
- **************************************************************************/
-
-
- typedef struct ENVPR{
- UBYTE flg; /* envelope flag */
- UBYTE pts; /* number of envelope points */
- UBYTE sus; /* envelope sustain index */
- UBYTE beg; /* envelope loop begin */
- UBYTE end; /* envelope loop end */
- SWORD p; /* current envelope counter */
- UWORD a; /* envelope index a */
- UWORD b; /* envelope index b */
- ENVPT *env; /* envelope points */
- } ENVPR;
-
-
- typedef struct AUDTMP{
- INSTRUMENT *i;
- SAMPLE *s;
-
- UWORD fadevol; /* fading volume */
-
- ENVPR venv;
- ENVPR penv;
-
- UBYTE keyon; /* if true=key is pressed. */
- UBYTE kick; /* if true=sample has to be restarted */
- UBYTE sample; /* which sample number (0-31) */
- SWORD handle; /* which sample-handle */
-
- ULONG start; /* The start byte index in the sample */
-
- UBYTE panning; /* panning position */
- UBYTE pansspd; /* panslide speed */
-
- SBYTE volume; /* amiga volume (0 t/m 64) to play the sample at */
- UWORD period; /* period to play the sample at */
-
- /* You should not have to use the values
- below in the player routine */
-
- SBYTE transpose;
-
- UBYTE note; /* */
-
- SWORD ownper;
- SWORD ownvol;
-
- UBYTE *row; /* row currently playing on this channel */
-
- SBYTE retrig; /* retrig value (0 means don't retrig) */
- UWORD c2spd; /* what finetune to use */
-
- SBYTE tmpvolume; /* tmp volume */
-
- UWORD tmpperiod; /* tmp period */
- UWORD wantedperiod; /* period to slide to (with effect 3 or 5) */
-
- UWORD slidespeed; /* */
- UWORD portspeed; /* noteslide speed (toneportamento) */
-
- UBYTE s3mtremor; /* s3m tremor (effect I) counter */
- UBYTE s3mtronof; /* s3m tremor ontime/offtime */
-
- UBYTE s3mvolslide; /* last used volslide */
-
- UBYTE s3mrtgspeed; /* last used retrig speed */
- UBYTE s3mrtgslide; /* last used retrig slide */
-
- UBYTE glissando; /* glissando (0 means off) */
- UBYTE wavecontrol; /* */
-
- SBYTE vibpos; /* current vibrato position */
- UBYTE vibspd; /* "" speed */
- UBYTE vibdepth; /* "" depth */
-
- SBYTE trmpos; /* current tremolo position */
- UBYTE trmspd; /* "" speed */
- UBYTE trmdepth; /* "" depth */
-
- UWORD soffset; /* last used sample-offset (effect 9) */
- } AUDTMP;
-
-
- extern AUDTMP mp_audio[32]; /* max eight channels */
- extern UBYTE mp_bpm; /* beats-per-minute speed */
- extern UWORD mp_patpos; /* current row number (0-63) */
- extern SWORD mp_sngpos; /* current song position */
- extern UWORD mp_sngspd; /* current songspeed */
-
- extern BOOL mp_loop;
- extern BOOL mp_panning;
- extern BOOL mp_extspd;
- extern UBYTE mp_volume;
-
- /*
- player prototypes:
- */
-
- int MP_Ready(void);
- void MP_NextPosition(void);
- void MP_PrevPosition(void);
- void MP_SetPosition(UWORD pos);
- void MP_HandleTick(void);
- void MP_Init(UNIMOD *m);
-
-
- /**************************************************************************
- ****** Virtual channel stuff: *********************************************
- **************************************************************************/
-
- BOOL VC_Init(void);
- void VC_Exit(void);
-
- void VC_PlayStart(void);
- void VC_PlayStop(void);
-
- SWORD VC_SampleLoad(FILE *fp,ULONG size,ULONG reppos,ULONG repend,UWORD flags);
- void VC_SampleUnload(SWORD handle);
-
- void VC_WriteSamples(SBYTE *buf,UWORD todo);
- UWORD VC_WriteBytes(SBYTE *buf,UWORD todo);
- void VC_SilenceBytes(SBYTE *buf,UWORD todo);
-
- void VC_VoiceSetVolume(UBYTE voice,UBYTE vol);
- void VC_VoiceSetFrequency(UBYTE voice,ULONG frq);
- void VC_VoiceSetPanning(UBYTE voice,UBYTE pan);
- void VC_VoicePlay(UBYTE voice,SWORD handle,ULONG start,ULONG size,ULONG reppos,ULONG repend,UWORD flags);
-
- #endif
-